
// 本地数据为demo08
var db=connect('demo08'); //链接数据库

// $push追加数组/内嵌文档值
  // $push的功能是追加 "数组" 中的值，但我们也经常用它操作内嵌稳文档，就是{}对象型的值。先看一个追加数组值的方式，比如我们要给小王加上一个爱好(interset)为画画（draw）：
// db.workmate.update({ 'name': 'xiaoWang' }, { $push: { aihao: 'draw' } });  //加进来的是一个数组 { "_id" : ObjectId("5b8aa095283e6b5608563aae"), "name" : "xiaoWang", "age" : 20, "aihao" : [ "draw" ] }

  // 当然$push修饰符还可以为 "内嵌文档" 增加值，比如我们现在要给我们的UI，增加一项新的技能skillFour为draw，这时候我们可以操作为：
  // UI原本数据为{ "_id" : ObjectId("5b8a9fc8b98908f8cdac7476"), "name" : "MinJie", "age" : 20, "sex" : 1, "job" : "UI设计", "skill" : { "skillOne" : "PhotoShop", "SkillTwo" : "UI", "SkillThree" : "Word+Excel+PPT" }, "regeditTime" : ISODate("2018-09-01T14:18:48.663Z") }
// db.workmate.update({ 'name':'MinJie'},{$push:{'skill.SkillFour':'draw'}})
  // 添加后,UI数据为: { "_id" : ObjectId("5b8a9fc8b98908f8cdac7476"), "name" : "MinJie", "age" : 20, "sex" : 1, "job" : "UI设计", "skill" : { "skillOne" : "PhotoShop", "SkillTwo" : "UI", "SkillThree" : "Word+Excel+PPT", "SkillFour" : [ "draw" ] }, "regeditTime" : ISODate("2018-09-01T14:18:48.663Z") }

// $push修饰符在工作中是最常用的，因为我们的数据一般都会涉及数组和内嵌文档的操作，一定要掌握。


// $ne查找是否存在
  // 它主要的作用是，检查一个值是否存在，如果不存在再执行操作，存在就不执行，这个很容易弄反，记得我刚学的时候就经常弄反这个修改器的作用，给自己增加了很多坑。
  // 例子：如果xiaoWang的爱好（interest）里没有palyGame这个值，我们就加入Game这个爱好。
  // 原本值为{ "_id" : ObjectId("5b8aa095283e6b5608563aae"), "name" : "xiaoWang", "age" : 20, "aihao" : [ "draw" ] }
// db.workmate.update({'name':'xiaoWang','aihao':{$ne:'palyGame'}},{$push:{'aihao':'Game'}});
  //改后值为: { "_id" : ObjectId("5b8aa095283e6b5608563aae"), "name" : "xiaoWang", "age" : 20, "aihao" : [ "draw", "Game" ] }
// 总结：没有则修改，有则不修改。


// $addToSet 升级版的$ne  注意$addToSet是驼峰命名,别打错了,打错执行不会报错,但是实际没改成功
  // 它是$ne的升级版本（查找是否存在，不存在就push上去），操作起来更直观和方便，所以再工作中这个要比$en用的多。
  // 例子：我们现在要查看小王(xiaoWang)兴趣(interest)中有没有阅读（readBook）这项，没有则加入读书(readBook)的兴趣.
  // 原本值为:{ "_id" : ObjectId("5b8aa095283e6b5608563aae"), "name" : "xiaoWang", "age" : 20, "aihao" : [ "draw", "Game" ] }
// db.workmate.update({name:'xiaoWang'},{$addToSet:{'aihao':'readbook'}})
  // 改后值为: { "_id" : ObjectId("5b8aa095283e6b5608563aae"), "name" : "xiaoWang", "age" : 20, "aihao" : [ "draw", "Game", "readbook" ] }

  
// $each 批量追加
  // 它可以传入一个数组，一次增加多个值进去，相当于批量操作，性能同样比循环操作要好很多，这个是需要我们注意的，工作中也要先组合成数组，然后用批量的形式进行操作。
  // 例子：我们现在要给xiaoWang, 一次加入三个爱好，唱歌（Sing），跳舞（Dance），编码（Code）。
  // 原本值为: { "_id" : ObjectId("5b8aa095283e6b5608563aae"), "name" : "xiaoWang", "age" : 20, "aihao" : [ "draw", "Game", "readbook" ] }
// var newInterset = ["Sing", "Dance", "Code"];
// db.workmate.update({ 'name': 'xiaoWang' }, { $addToSet: { 'aihao': { $each: newInterset}}})
  // 改后的值为: { "_id" : ObjectId("5b8aa095283e6b5608563aae"), "name" : "xiaoWang", "age" : 20, "aihao" : [ "draw", "Game", "readbook", "Sing", "Dance", "Code" ] }


// $pop 删除数组值
  // $pop只删除一次，并不是删除所有数组中的值。而且它有两个选项，一个是1和-1。
  // 1：从数组末端进行删除
  // -1：从数组开端进行删除
  // 例子：现在要删除xiaoWang的编码爱好（code）。
  // 原本值为:{ "_id" : ObjectId("5b8aa095283e6b5608563aae"), "name" : "xiaoWang", "age" : 20, "aihao" : [ "draw", "Game", "readbook", "Sing", "Dance", "Code" ] }
// db.workmate.update({name:'xiaoWang'},{$pop:{aihao:1}})
  // 改后的值为: { "_id" : ObjectId("5b8aa095283e6b5608563aae"), "name" : "xiaoWang", "age" : 20, "aihao" : [ "draw", "Game", "readbook", "Sing", "Dance" ] }



// 数组定位修改
  // 有时候只知道修改数组的第几位，但并不知道是什么，这时候我们可以使用interest.int 的形式。
  // 例子，比如我们现在要修改xiaoWang的第三个兴趣为编码（Code），注意这里的计数是从0开始的。
  // 原本值为:{ "_id" : ObjectId("5b8aa095283e6b5608563aae"), "name" : "xiaoWang", "age" : 20, "aihao" : [ "draw", "Game", "readbook", "Sing", "Dance" ] }
// db.workmate.update({name:'xiaoWang'},{$set:{'aihao.2':'Code'}})
  // 改后的值为: { "_id" : ObjectId("5b8aa095283e6b5608563aae"), "name" : "xiaoWang", "age" : 20, "aihao" : [ "draw", "Game", "Code", "Sing", "Dance" ] }

// 总结：这节课主要讲了于数组和内嵌文档有关的update修改器，内容很多，都需要不断熟练记忆。当然如果你记不住，你至少记住这个博客网址，因为技术胖把笔记已经给你整理好了。


// 个人练习
  // 1. xiaoWang这个用户,把它第二个爱好删除了
    // 原本数据为: { "_id" : ObjectId("5b8aa095283e6b5608563aae"), "name" : "xiaoWang", "age" : 20, "aihao" : [ "draw", "Game", "Code", "Sing", "Dance" ] }
db.workmate.update({name:'xiaoWang'},{$unset:{'aihao.1':''}}) //只变成了null,并没能删除
    // 改后值为: { "_id" : ObjectId("5b8aa095283e6b5608563aae"), "name" : "xiaoWang", "age" : 20, "aihao" : [ "draw", null, "Code", "Sing", "Dance" ] }




print('执行成功');